home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
QRZ! Ham Radio 8
/
QRZ Ham Radio Callsign Database - Volume 8.iso
/
mac
/
german
/
tcpip
/
gp160.exe
/
#GPRI.EXE
/
GPRI.DOC
< prev
next >
Wrap
Text File
|
1993-05-14
|
14KB
|
398 lines
GPRI - Das Graphic Packet Remote-Interface
Version 1.0
(C) Ulf Saran, DH1DAE, 1990-1993
Dieses Dokument wurde erstellt von
Stefan Pfeiffer, DD9EP@DB0IZ, 930401, letzte Modifikation 930405
S P E Z I F I K A T I O N
-------------------------
0. Inhaltsverzeichnis
1. Einführung
2. Interrupt-Funktionen des Interrupt 2Fh
2.1. Funktion FFh - Get Version Number
2.2. Funktion 00h - Register as Remoteprogram
2.3. Funktion 01h - Get FileTransfer-Address
2.4. Funktion 02h - Get QSO-Data-Address
3. GPRI-Routinen
3.1. Die GPRI-Sende-Routine
3.2. Die GPRI-FileTransfer-Routine
3.3. Die GPRI-QSO-Daten-Routine
4. Erforderliche Routinen des Remote-Programms
4.1. Die Initialisierungs-Routine
4.2. Die Empfangs-Routine
4.3. Die Strategie-Routine
4.4. Die Exit-Routine
5. Schematischer Ablauf eines GPRI-Programms
6. Tips und Tricks
1. Einführung
Das GPRI ist eine Sammlung von Funktionen, die es externen DOS-Programmen
erlauben, mit GP zu kommunizieren und GP in begrenztem Umfang zu steuern.
So kann das Remoteprogramm direkt aus seinem Programmlauf heraus Texte senden
und empfangen. Dabei muß es sich nicht um die Bedienung eines TNC kümmern,
da diese Aufgaben völlig von GP übernommen werden.
Beim Aufruf eines interaktiven Remoteprogramms (das also das GPRI nutzt),
lädt das GPRI das Programm in den Speicher und führt, nachdem sich das
Programm als GPRI-Programm "angemeldet" hat, eine Initialisierungsroutine
aus, in der das Programm z.B. eine Startmeldung ausgeben kann.
Dann wird eine bestimmte Routine im Remoteprogramm immer dann angesprungen,
wenn ein Text auf dem betreffenden Kanal empfangen wurde. Das Remote-
programm kann dann auf den empfangenen Text reagieren und eine Antwort
zurücksenden.
Auf Anforderung des Programms wird es dann vom GPRI wieder aus dem Speicher
entfernt.
Das GPRI basiert also völlig auf einer Client/Server-Struktur zwischen GP
und dem Remoteprogramm, da das GPRI-Programm Dienste wie "String senden",
"Datei senden" und "QSO-Daten erfragen" direkt von GP anfordert.
Dadurch wird es möglich, Remoteprogramme über PR genauso zu bedienen, als
würden sie unter DOS laufen, nämlich durch eine interaktive Kommunikation
mit dem Programm. Dadurch bieten sich viel weitere Möglichkeiten für Remote-
programme als bisher.
Dieses Dokument beschreibt die Schnittstelle zwischen GP und dem interaktiven
Remoteprogramm. Sie ist von der verwendeten Programmiersprache unabhängig,
sie sollte aber Interrupts aufrufen können und Assembler-Einbindung unter-
stützen. Ich setze ein gewisses Maß an Programmierkenntnissen vorraus, da
das GPRI und dessen Programmierung relativ komplex und fehleranfällig sind.
Dies ist dadurch bedingt, daß es bei einem GPRI-Programm kein eigentliches
Hauptprogramm gibt, sondern fast alles in den Routinen erledigt wird, die
von GPRI aufgerufen werden.
2. Interrupt-Funktionen des Interrupt 2Fh
Zur ersten Kontaktaufnahme mit dem GPRI bedient sich das Remoteprogramm des
Interrupt 2Fh. Über ihn kann es feststellen, ob es überhaupt unter GPRI
läuft und welche Version des GPRI unterstützt wird. Weiterhin kann
es die Einsprungadressen für die eigentliche Sende-Routine erfragen
und seine eigenen Routinen beim GPRI "registrieren" lassen.
Um das GPRI anzusprechen, muß das Remoteprogramm in AH den Wert DFh laden,
in AL wird die Funktionsnummer eingetragen.
2.1. Funktion FFh - Get Version Number
Mit dieser Funktion kann das Remoteprogramm feststellen, ob es überhaupt
von GP aus gestartet wurde, und welche GPRI-Version unterstützt wird.
Eingabe:
AH: DFh (Code, um das GPRI anzusprechen)
AL: FFh (Funktionsnummer)
Ausgabe:
Wenn AX gleich 4750h ist, läuft das Remoteprogramm unter GPRI (4750h
entspricht in ASCII 'GP').
Dann gilt:
BH: Versionsnummer
BL: Revisionsnummer
Bei GPRI Version 1.0 enthält BH also den Wert 1, BL den Wert 0.
Wenn AX ungleich 4750h ist, dann läuft das Remoteprogramm unter DOS,
und das GPRI ist nicht installiert.
2.2. Funktion 00h - Register as Remoteprogram
Mit dieser Funktion meldet sich das Remote-Programm beim GPRI an, und
erhält im Gegenzug die Adresse der GPRI-Sende-Routine und ein Handle, was
das Programm gegenüber dem GPRI identifiziert.
Diese Funktion muß von einem Remote-Programm aufgerufen werden, bevor es
irgendeine andere GPRI-Routine aufruft.
Eingabe:
AH: DFh (Code, um das GPRI anzusprechen)
AL: 00h (Funktionsnummer)
ES: Segment der folgenden Datenstruktur
BX: Offset der folgenden Datenstruktur
Prefixsegment des Remoteprogramms : WORD
Adresse der Initialisierungsroutine : POINTER
Adresse der Empfangs-Routine : POINTER
Adresse der Strategie-Routine : POINTER
Adresse der Exit-Routine : POINTER
Ausgabe:
Wenn AX ungleich 4750h ('GP'), dann: Fehler!
Wenn AX gleich 4750h, dann gilt:
ES: Segment der GPRI-Sende-Routine
BX: Offset der GPRI-Sende-Routine
CL: Handle des Remote-Programms
Erläuterung der Sende-Routine siehe: 3.1.
Erläuterung der Routinen in der Datenstruktur siehe: 4.
2.3. Funktion 01h - Get FileTransfer-Address
Mit dieser Funktion kann das Remoteprogramm die Adresse der GPRI-Routine
erfragen, um eine Datei auszusenden.
Eingabe:
AH: DFh (Code, um das GPRI anzusprechen)
AL: 01h (Funktionsnummer)
Ausgabe:
Wenn AX ungleich 4750h ('GP'), dann: Fehler!
Wenn AX gleich 4750h, dann gilt:
ES: Segment der GPRI-Datei-Sende-Routine
BX: Offset der GPRI-Datei-Sende-Routine
Erläuterung der Datei-Sende-Routine siehe: 3.2.
2.4. Funktion 02h - Get QSO-Data-Address
Durch diese Funktion erhält das Remoteprogramm die Adresse einer GPRI-
Routine, die wiederum die aktuellen QSO-Daten zurückgibt.
Eingabe:
AH: DFh (Code, um das GPRI anzusprechen)
AL: 02h (Funktionsnummer)
Ausgabe:
Wenn AX ungleich 4750h ('GP'): Fehler!
Wenn AX gleich 4750h, dann gilt:
ES: Segment der GPRI-QSO-Daten-Routine
BX: Offset der GPRI-QSO-Daten-Routine
Erläuterung der QSO-Daten-Routine siehe: 3.3.
3. GPRI-Routinen
3.1. Die GPRI-Sende-Routine
Die Adresse dieser Routine wird von der Interrupt-Funktion 00h zurück-
gegeben. Sie muß wie alle GPRI-Routinen mit einem FAR CALL aufgerufen
werden.
Dabei haben die Register folgende Bedeutung:
BL: Handle des Remote-Programms
BH: Prompt-Flag (1 -> Sende-Buffer leeren, 0 -> Sende-Buffer nicht
leeren)
CL: Macro-Flag (1 -> Macro-Auswertung vornehmen, 0 -> Auswertung nicht
vornehmen)
ES: Segment des zu sendenden Strings
DX: Offset des zu sendenden Strings
Es handelt sich bei dem String um einen Pascal-String mit führendem
Längenbyte. Er wird nicht durch eine binäre 0 terminiert.
Nach Aufruf der Funktion hat das AX-Register den Wert 1, wenn kein Fehler
auftrat. Konnte der String nicht gesendet werden (Keine freien TNC-Puffer),
enthält das AX-Register den Wert 0.
3.2. Die GPRI-FileTransfer-Routine
Diese Routine erlaubt es dem Remoteprogramm, eine beliebige Datei auszu-
senden. Vorher muss die Adresse der Routine über die Interruptfunktion
01h erfragt werden. Auch diese Routine wird über einen FAR CALL auf-
gerufen.
Bedeutung der Register:
BL: Handle des Remoteprogramms
BH: Modus des FileTransfers
0: Textdatei
1: Binärdatei 1:1 (Kein AutoBin)
2: AutoBin
ES: Segment des Dateinamens
DX: Offset des Dateinamens
Dabei ist zu beachten, daß es sich bei dem Dateinamen um einen String
nach Pascal-Art handelt, also ein String mit führendem Längenbyte. Er
wird nicht mit einer binären 0 terminiert.
Nach Aufruf der Funktion enthält AX eine 1, wenn kein Fehler auftrat,
sonst eine 0.
Während eines Dateitransfers wird die Strategie-Routine NICHT aufgerufen!
3.3. Die GPRI-QSO-Daten-Routine
Über diese Routine kann das Remoteprogramm Informationen über das
aktuelle QSO abrufen. Die Adresse muss vorher über die Funktion 02h
erfragt werden, der Aufruf erfolgt über einen FAR CALL.
Bedeutung der Register:
BL: Handle des Remote-Programms
ES: Segment der folgenden Datenstruktur
DX: Offset der folgenden Datenstruktur
MyCall : String[9] (MyCall auf dem aktuellen Kanal)
Call : String[9] (Call der Gegenstation)
Name : String[80] (Name der Gegenstation)
Pfad : String[255] (Connect-Pfad der Gegenstation)
Dabei ist wieder zu beachten, daß es sich um Pascal-Strings handeln
muß. Der MyCall-String ist also 10 Bytes lang: 1 Längenbyte und 9
Datenbytes. Die Gesamtlänge der Struktur beträgt also 357 Bytes.
Wurde die Funktion erfolgreich ausgeführt, enthält das AX-Register eine 1,
ansonsten eine 0.
4. Erforderliche Routinen des Remote-Programms
Die Adressen der folgenden Routinen müssen dem GPRI über die Funktion 00h
zugänglich gemacht werden. Alle diese Routinen müssen FAR kompiliert
sein!
4.1. Die Initialisierungs-Routine
Eingabe:
Keine
Ausgabe:
BL: Programmbeendigung (0 -> Nein, 1 -> Ja)
Diese Routine wird vom GPRI aufgerufen, nachdem das Remote-Programm in
den Speicher geladen wurde. Hier kann es z.b. eine Begrüssung ausgeben.
ACHTUNG: Aus dem Hauptprogramm heraus sollten keine GPRI-Funktionen
wie "Text senden" aufgerufen werden, da dies zu Problemen führen kann.
Deshalb sollte eine Begrüssung wirklich nur in der Initialisierungs-
routine ausgegeben werden.
4.2. Die Empfangs-Routine
Eingabe:
ES: Segment des empfangenen Strings
DX: Offset des empfangenen Strings
Dabei handelt es sich wiederum um einen String im Pascal-Format.
Ausgabe:
BL: Programmbeendigung (0 -> Nein, 1 -> Ja)
Diese Routine wird immer aufgerufen, wenn ein Text empfangen wurde.
Die Routine kann den empfangenen Text auswerten, einen Antwort-Text
oder eine Datei zurücksenden und eventuell BL auf 1 setzen, um sich
selbst zu beenden.
4.3. Die Strategie-Routine
Eingabe:
Keine
Ausgabe:
BL: Programmbeendigung (0 -> Nein, 1 -> Ja)
Diese Routine wird von GP periodisch aufgerufen, außer bei FileTransfers.
Sie lässt sich somit als Timer-Routine einsetzen, oder um das Ende eines
FileTransfers erkennen zu können.
4.4. Die Exit-Routine
Eingabe:
Keine
Ausgabe:
Keine
Diese Routine wird aufgerufen, bevor das GPRI das Remote-Programm aus dem
Speicher entfernt. Dies kann in folgenden Fällen geschehen:
a) Das Remoteprogramm hat BL auf 1 gesetzt und fordert damit seine
Beendigung an.
b) Das QSO wird vorzeitig durch Re- oder Disconnect unterbrochen.
c) GP wird beendet.
5. Schematischer Ablauf eines GPRI-Programms
Um das GPRI-Prinzip etwas klarer werden zu lassen, wird im folgenden
der prinzipelle Ablauf eines GPRI-Programms beschrieben.
Es empfiehlt sich, die Programme sowohl unter GPRI als auch unter DOS
lauffähig zu machen. Das Programm sollte also Eingaben von der Tastatur
entgegennehmen und seine Texte auf dem Monitor ausgeben, wenn es fest-
stellt, daß es nicht unter dem GPRI läuft. Alternativ dazu kann sich das
Programm natürlich auch selbst beenden.
Nun das Schema eines GPRI-Programms:
PROZEDUR Init (FAR!)
{
Startmeldung über Sende-Routine ausgeben
BL auf 0 setzen (Kein Programmende)
}
PROZEDUR Empfang (FAR!)
{
Empfangstext analysieren
Antworttext oder Datei zurücksenden
Eventuell BL auf 1 setzen, um Programm zu beenden
}
PROZEDUR Ende (FAR!)
{
Eventuell Speicher freigeben und ähnliches
}
PROZEDUR Main (Hauptprogramm)
{
Version des GPRI feststellen
Wenn Fehler, dann unter DOS normal arbeiten oder beenden
Adressen der Routinen Init,Empfang und Ende sowie das Prefix-Segment an
das GPRI melden, Adresse der Sende-Routine und Handle merken
Eventuell Adressen der QSO-Daten-Routine und der FileTransfer-Routine
erfragen und merken
Programm beenden und im Speicher lassen (evtl. durch Befehl der
Programmiersprache oder durch INT 21h, Funktion 31h)
}
6. Tips und Tricks
Es ist wichtig, den Heap- und Stackbedarf des Remote-Programms zu begrenzen,
da es ja speicherresident bleibt. Auch der Stack muß nicht zu groß bemessen
sein, da später der Stack von GP mitbenutzt wird. Er sollte ihn auf den
kleinstmöglichen Wert einstellen.
Viel Spaß mit den unglaublichen Möglichkeiten interaktiver Remote-
Programme und der Programmierung des GPRI.
Vy 73, Stefan Pfeiffer, DD9EP